<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>82_原型</title>
		<script>
			/* 
			访问一个对象的原型对象：
				1.对象.__proto__
				2.Object.getPrototypeOf(p1)，检查某个对象原型，跟上面访问的是同一个对象。
				  Object.getPrototypeOf(p1) === p1.__proto__ 返回true
				3.原型对象中的数据:22
					1.对象中的数据(属性、方法等)，比如person对象中sayHello方法，toString方法。
					2.constructor(对象的构造函数)
					
				注意:
					原型对象也有原型，这样就构成了一条原型链，根据对象的复杂程度不同，原型链的长度也
					不同。比如：
					p对象的原型链:p对象 --> 原型 --> 原型的原型 --> null;
					obj对象的原型链:obj对象 --> 原型 --> null
					
				原型链:
					读取对象属性时，会优先对象自身属性，
					如果对象中有，则使用，没有则去对象的原型中寻找
					如果原型中有，则使用，没有则去原型的原型中寻找
					直到找到Object对象的原型(Object的原型没有原型(为null))
					如果依然没有找到，则返回undefined
					
				-作用域链，是找变量的链，找不到会报错
				-原型链，是找属性的链，找不到会返回undefined
			 */
			class Person {
				name = "孙悟空";
				age = 18;
				fn = () => {}
				sayHello() {
					console.log("...", this.name);
				}
			}
			const p1 = new Person();
			console.log(p1); //p1对象本身：Person {name: '孙悟空', age: 18, fn: ƒ}
			console.log(p1.__proto__); //p1原型对象：{constructor: ƒ, sayHello: ƒ}
			console.log(Object.getPrototypeOf(p1)); //检查某个对象原型，打印的和上面一句一样。
			console.log(Object.getPrototypeOf(p1) === p1.__proto__)
			console.log(p1.__proto__.__proto__);
			
			const obj={}
			console.log(obj.__proto__.__proto__);//obj的原型的原型为null；
		</script>
	</head>
	<body>
	</body>
</html>